import piexif from 'piexifjs';

/**
 * 将消息嵌入图片元数据
 * @param {string} base64Str - 图片的base64字符串
 * @param {string} message - 要嵌入的消息
 * @returns {string} - 带有元数据的新base64字符串
 */
export function embedMessageInMetadata(base64Str, message) {
	// 提取图片二进制数据
	const binaryData = atob(base64Str.split(",")[1]);

	// 创建自定义元数据
	const exifData = {
		"0th": {},
		"Exif": {
			[piexif.ExifIFD.UserComment]: message, // 转换字符串为字节数组
		},
		"GPS": {},
		"1st": {},
		"thumbnail": null,
	};

	// 插入元数据
	const exifBinary = piexif.dump(exifData);
	const newBinaryData = piexif.insert(exifBinary, binaryData);

	// 返回带有元数据的 Base64
	return `data:image/jpeg;base64,${btoa(newBinaryData)}`;
}

/**
 * 从图片元数据中提取消息
 * @param {string} base64Str - 图片的base64字符串
 * @returns {string|null} - 提取的消息或null
 */
export function extractMessageFromMetadata(base64Str) {
	// 提取图片二进制数据
	const binaryData = atob(base64Str.split(",")[1]);

	// 解析元数据
	const exifData = piexif.load(binaryData);

	// 提取隐藏信息
	const userComment = exifData.Exif[piexif.ExifIFD.UserComment];
	return userComment ? bytesToString(userComment) : null;
}

/**
 * 将字符串转换为字节数组
 * @param {string} str - 输入字符串
 * @returns {Uint8Array} - 字节数组
 */
export function stringToBytes(str) {
	const encoder = new TextEncoder();
	return encoder.encode(str);
}

/**
 * 将字节数组转换为字符串
 * @param {Uint8Array} bytes - 字节数组
 * @returns {string} - 解码后的字符串
 */
export function bytesToString(bytes) {
	const decoder = new TextDecoder('utf-8');
	return decoder.decode(bytes);
}

/**
 * 将ArrayBuffer转换为二进制字符串
 * @param {ArrayBuffer} buffer - ArrayBuffer数据
 * @returns {string} - 二进制字符串
 */
export function arrayBufferToBinaryString(buffer) {
	const uint8Array = new Uint8Array(buffer);
	let binary = '';
	for (let i = 0; i < uint8Array.length; i++) {
		binary += String.fromCharCode(uint8Array[i]);
	}
	return binary;
}

/**
 * 从图片文件中提取模板数据
 * @param {File} file - 图片文件
 * @param {Function} onSuccess - 成功回调
 * @param {Function} onError - 错误回调
 */
export function extractTemplateFromImage(file, onSuccess, onError) {
	const reader = new FileReader();

	reader.onload = function(event) {
		const arrayBuffer = event.target.result;
		const binaryData = arrayBufferToBinaryString(arrayBuffer);

		try {
			const exifData = piexif.load(binaryData);
			const userComment = exifData.Exif[piexif.ExifIFD.UserComment];

			if (userComment && userComment !== '') {
				const decodedMessage = decodeURIComponent(userComment);
				const templateData = JSON.parse(decodedMessage);
				onSuccess(templateData);
			} else {
				onError(new Error('模板文件解析失败'));
			}
		} catch (error) {
			console.error("解析失败", error);
			onError(error);
		}
	};

	reader.readAsArrayBuffer(file);
}